home *** CD-ROM | disk | FTP | other *** search
/ PC PowerPlay 22 / PCPP #22.iso / Quake2 / q2source_12_11 / utils3 / qe4 / win_main.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-10-11  |  32.8 KB  |  1,306 lines

  1. #include "qe3.h"
  2. #include <process.h>
  3. #include "mru.h"
  4. #include "entityw.h"
  5.  
  6. static HWND      s_hwndToolbar;
  7.  
  8. BOOL SaveRegistryInfo(const char *pszName, void *pvBuf, long lSize);
  9. BOOL LoadRegistryInfo(const char *pszName, void *pvBuf, long *plSize);
  10.  
  11. static HWND CreateMyStatusWindow(HINSTANCE hInst);
  12. static HWND CreateToolBar(HINSTANCE hinst);
  13.  
  14. extern int WXY_Print( void );
  15.  
  16. /*
  17. ==============================================================================
  18.  
  19.   MENU
  20.  
  21. ==============================================================================
  22. */
  23.  
  24. void OpenDialog (void);
  25. void SaveAsDialog (void);
  26. qboolean ConfirmModified (void);
  27. void  Select_Ungroup (void);
  28.  
  29. void QE_ExpandBspString (char *bspaction, char *out, char *mapname)
  30. {
  31.     char    *in;
  32.     char    src[1024];
  33.     char    rsh[1024];
  34.     char    base[256];
  35.  
  36.     ExtractFileName (mapname, base);
  37.     sprintf (src, "%s/maps/%s", ValueForKey(g_qeglobals.d_project_entity, "remotebasepath"), base);
  38.     strcpy (rsh, ValueForKey(g_qeglobals.d_project_entity, "rshcmd"));
  39.  
  40.     in = ValueForKey( g_qeglobals.d_project_entity, bspaction );
  41.     while (*in)
  42.     {
  43.         if (in[0] == '!')
  44.         {
  45.             strcpy (out, rsh);
  46.             out += strlen(rsh);
  47.             in++;
  48.             continue;
  49.         }
  50.         if (in[0] == '$')
  51.         {
  52.             strcpy (out, src);
  53.             out += strlen(src);
  54.             in++;
  55.             continue;
  56.         }
  57.         if (in[0] == '@')
  58.         {
  59.             *out++ = '"';
  60.             in++;
  61.             continue;
  62.         }
  63.         *out++ = *in++;
  64.     }
  65.     *out = 0;
  66. }
  67.  
  68.  
  69.  
  70. void RunBsp (char *command)
  71. {
  72.     char    sys[1024];
  73.     char    batpath[1024];
  74.     char    outputpath[1024];
  75.     char    temppath[512];
  76.     char    name[1024];
  77.     FILE    *hFile;
  78.     BOOL    ret;
  79.     PROCESS_INFORMATION ProcessInformation;
  80.     STARTUPINFO    startupinfo;
  81.  
  82.     SetInspectorMode (W_CONSOLE);
  83.  
  84.     if (bsp_process)
  85.     {
  86.         Sys_Printf ("BSP is still going...\n");
  87.         return;
  88.     }
  89.  
  90.     GetTempPath(512, temppath);
  91.     sprintf (outputpath, "%sjunk.txt", temppath);
  92.  
  93.     strcpy (name, currentmap);
  94.     if (region_active)
  95.     {
  96.         Map_SaveFile (name, false);
  97.         StripExtension (name);
  98.         strcat (name, ".reg");
  99.     }
  100.  
  101.     Map_SaveFile (name, region_active);
  102.  
  103.  
  104.     QE_ExpandBspString (command, sys, name);
  105.  
  106.     Sys_ClearPrintf ();
  107.     Sys_Printf ("======================================\nRunning bsp command...\n");
  108.     Sys_Printf ("\n%s\n", sys);
  109.  
  110.     //
  111.     // write qe3bsp.bat
  112.     //
  113.     sprintf (batpath, "%sqe3bsp.bat", temppath);
  114.     hFile = fopen(batpath, "w");
  115.     if (!hFile)
  116.         Error ("Can't write to %s", batpath);
  117.     fprintf (hFile, sys);
  118.     fclose (hFile);
  119.  
  120.     //
  121.     // write qe3bsp2.bat
  122.     //
  123.     sprintf (batpath, "%sqe3bsp2.bat", temppath);
  124.     hFile = fopen(batpath, "w");
  125.     if (!hFile)
  126.         Error ("Can't write to %s", batpath);
  127.     fprintf (hFile, "%sqe3bsp.bat > %s", temppath, outputpath);
  128.     fclose (hFile);
  129.  
  130.     Pointfile_Delete ();
  131.  
  132.     GetStartupInfo (&startupinfo);
  133.  
  134.     ret = CreateProcess(
  135.     batpath,        // pointer to name of executable module 
  136.     NULL,            // pointer to command line string
  137.     NULL,            // pointer to process security attributes 
  138.     NULL,            // pointer to thread security attributes 
  139.     FALSE,            // handle inheritance flag 
  140.     0 /*DETACHED_PROCESS*/,        // creation flags 
  141.     NULL,            // pointer to new environment block 
  142.     NULL,            // pointer to current directory name 
  143.     &startupinfo,    // pointer to STARTUPINFO 
  144.     &ProcessInformation     // pointer to PROCESS_INFORMATION  
  145.    );
  146.  
  147.     if (!ret)
  148.         Error ("CreateProcess failed");
  149.  
  150.     bsp_process = ProcessInformation.hProcess;
  151.  
  152.     Sleep (100);    // give the new process a chance to open it's window
  153.  
  154.     BringWindowToTop( g_qeglobals.d_hwndMain );    // pop us back on top
  155.     SetFocus (g_qeglobals.d_hwndCamera);
  156. }
  157.  
  158. /*
  159. =============
  160. DoColor
  161.  
  162. =============
  163. */
  164. qboolean DoColor(int iIndex)
  165. {
  166.     CHOOSECOLOR    cc;
  167.     static COLORREF    custom[16];
  168.  
  169.     cc.lStructSize = sizeof(cc);
  170.     cc.hwndOwner = g_qeglobals.d_hwndMain;
  171.     cc.hInstance = g_qeglobals.d_hInstance;
  172.     cc.rgbResult = 
  173.         (int)(g_qeglobals.d_savedinfo.colors[iIndex][0]*255) +
  174.         (((int)(g_qeglobals.d_savedinfo.colors[iIndex][1]*255))<<8) +
  175.         (((int)(g_qeglobals.d_savedinfo.colors[iIndex][2]*255))<<16);
  176.     cc.lpCustColors = custom;
  177.     cc.Flags = CC_FULLOPEN|CC_RGBINIT; 
  178.     //cc.lCustData; 
  179.     //cc.lpfnHook; 
  180.     //cc.lpTemplateName
  181.  
  182.     if (!ChooseColor(&cc))
  183.         return false;
  184.  
  185.     g_qeglobals.d_savedinfo.colors[iIndex][0] = (cc.rgbResult&255)/255.0;
  186.     g_qeglobals.d_savedinfo.colors[iIndex][1] = ((cc.rgbResult>>8)&255)/255.0;
  187.     g_qeglobals.d_savedinfo.colors[iIndex][2] = ((cc.rgbResult>>16)&255)/255.0;
  188.  
  189.     /* 
  190.     ** scale colors so that at least one component is at 1.0F 
  191.     ** if this is meant to select an entity color
  192.     */
  193.     if ( iIndex == COLOR_ENTITY )
  194.     {
  195.         float largest = 0.0F;
  196.  
  197.         if ( g_qeglobals.d_savedinfo.colors[iIndex][0] > largest )
  198.             largest = g_qeglobals.d_savedinfo.colors[iIndex][0];
  199.         if ( g_qeglobals.d_savedinfo.colors[iIndex][1] > largest )
  200.             largest = g_qeglobals.d_savedinfo.colors[iIndex][1];
  201.         if ( g_qeglobals.d_savedinfo.colors[iIndex][2] > largest )
  202.             largest = g_qeglobals.d_savedinfo.colors[iIndex][2];
  203.  
  204.         if ( largest == 0.0F )
  205.         {
  206.             g_qeglobals.d_savedinfo.colors[iIndex][0] = 1.0F;
  207.             g_qeglobals.d_savedinfo.colors[iIndex][1] = 1.0F;
  208.             g_qeglobals.d_savedinfo.colors[iIndex][2] = 1.0F;
  209.         }
  210.         else
  211.         {
  212.             float scaler = 1.0F / largest;
  213.  
  214.             g_qeglobals.d_savedinfo.colors[iIndex][0] *= scaler;
  215.             g_qeglobals.d_savedinfo.colors[iIndex][1] *= scaler;
  216.             g_qeglobals.d_savedinfo.colors[iIndex][2] *= scaler;
  217.         }
  218.     }
  219.  
  220.     Sys_UpdateWindows (W_ALL);
  221.  
  222.     return true;
  223. }
  224.  
  225.  
  226. /* Copied from MSDN */
  227.  
  228. BOOL DoMru(HWND hWnd,WORD wId)
  229. {
  230.     char szFileName[128];
  231.     OFSTRUCT of;
  232.     BOOL fExist;
  233.  
  234.     GetMenuItem(g_qeglobals.d_lpMruMenu, wId, TRUE, szFileName, sizeof(szFileName));
  235.  
  236.     // Test if the file exists.
  237.  
  238.     fExist = OpenFile(szFileName ,&of,OF_EXIST) != HFILE_ERROR;
  239.  
  240.     if (fExist) {
  241.  
  242.         // Place the file on the top of MRU.
  243.         AddNewItem(g_qeglobals.d_lpMruMenu,(LPSTR)szFileName);
  244.  
  245.         // Now perform opening this file !!!
  246.         Map_LoadFile (szFileName);    
  247.     }
  248.     else
  249.         // Remove the file on MRU.
  250.         DelMenuItem(g_qeglobals.d_lpMruMenu,wId,TRUE);
  251.  
  252.     // Refresh the File menu.
  253.     PlaceMenuMRUItem(g_qeglobals.d_lpMruMenu,GetSubMenu(GetMenu(hWnd),0),
  254.             ID_FILE_EXIT);
  255.  
  256.     return fExist;
  257. }
  258.  
  259.  
  260. /* handle all WM_COMMAND messages here */
  261. LONG WINAPI CommandHandler (
  262.     HWND    hWnd,
  263.     WPARAM  wParam,
  264.     LPARAM  lParam)
  265. {
  266.     HMENU hMenu;
  267.  
  268.     switch (LOWORD(wParam))
  269.     {
  270. //
  271. // file menu
  272. //
  273.         case ID_FILE_EXIT:
  274.             /* exit application */
  275.             if (!ConfirmModified())
  276.                 return TRUE;
  277.  
  278.             PostMessage (hWnd, WM_CLOSE, 0, 0L);
  279.             break;
  280.  
  281.         case ID_FILE_OPEN:
  282.             if (!ConfirmModified())
  283.                 return TRUE;
  284.             OpenDialog ();
  285.             break;
  286.  
  287.         case ID_FILE_NEW:
  288.             if (!ConfirmModified())
  289.                 return TRUE;
  290.             Map_New ();
  291.             break;
  292.         case ID_FILE_SAVE:
  293.             if (!strcmp(currentmap, "unnamed.map"))
  294.                 SaveAsDialog ();
  295.             else
  296.                 Map_SaveFile (currentmap, false);    // ignore region
  297.             break;
  298.         case ID_FILE_SAVEAS:
  299.             SaveAsDialog ();
  300.             break;
  301.  
  302.         case ID_FILE_LOADPROJECT:
  303.             if (!ConfirmModified())
  304.                 return TRUE;
  305.             ProjectDialog ();
  306.             break;
  307.  
  308.         case ID_FILE_POINTFILE:
  309.             if (g_qeglobals.d_pointfile_display_list)
  310.                 Pointfile_Clear ();
  311.             else
  312.                 Pointfile_Check ();
  313.             break;
  314.  
  315. //
  316. // view menu
  317. //
  318.         case ID_VIEW_ENTITY:
  319.             SetInspectorMode(W_ENTITY);
  320.             break;
  321.         case ID_VIEW_CONSOLE:
  322.             SetInspectorMode(W_CONSOLE);
  323.             break;
  324.         case ID_VIEW_TEXTURE:
  325.             SetInspectorMode(W_TEXTURE);
  326.             break;
  327.  
  328.         case ID_VIEW_100:
  329.             g_qeglobals.d_xy.scale = 1;
  330.             Sys_UpdateWindows (W_XY|W_XY_OVERLAY);
  331.             break;
  332.         case ID_VIEW_ZOOMIN:
  333.             g_qeglobals.d_xy.scale *= 5.0/4;
  334.             if (g_qeglobals.d_xy.scale > 16)
  335.                 g_qeglobals.d_xy.scale = 16;
  336.             Sys_UpdateWindows (W_XY|W_XY_OVERLAY);
  337.             break;
  338.         case ID_VIEW_ZOOMOUT:
  339.             g_qeglobals.d_xy.scale *= 4.0/5;
  340.             if (g_qeglobals.d_xy.scale < 0.1)
  341.                 g_qeglobals.d_xy.scale = 0.1;
  342.             Sys_UpdateWindows (W_XY|W_XY_OVERLAY);
  343.             break;
  344.  
  345.         case ID_VIEW_Z100:
  346.             z.scale = 1;
  347.             Sys_UpdateWindows (W_Z|W_Z_OVERLAY);
  348.             break;
  349.         case ID_VIEW_ZZOOMIN:
  350.             z.scale *= 5.0/4;
  351.             if (z.scale > 4)
  352.                 z.scale = 4;
  353.             Sys_UpdateWindows (W_Z|W_Z_OVERLAY);
  354.             break;
  355.         case ID_VIEW_ZZOOMOUT:
  356.             z.scale *= 4.0/5;
  357.             if (z.scale < 0.125)
  358.                 z.scale = 0.125;
  359.             Sys_UpdateWindows (W_Z|W_Z_OVERLAY);
  360.             break;
  361.  
  362.         case ID_VIEW_CENTER:
  363.             camera.angles[ROLL] = camera.angles[PITCH] = 0;
  364.             camera.angles[YAW] = 22.5 * 
  365.                 floor( (camera.angles[YAW]+11)/22.5 );
  366.             Sys_UpdateWindows (W_CAMERA|W_XY_OVERLAY);
  367.             break;
  368.  
  369.         case ID_VIEW_UPFLOOR:
  370.             Cam_ChangeFloor (true);
  371.             break;
  372.         case ID_VIEW_DOWNFLOOR:
  373.             Cam_ChangeFloor (false);
  374.             break;
  375.  
  376.         case ID_VIEW_SHOWNAMES:
  377.             g_qeglobals.d_savedinfo.show_names = !g_qeglobals.d_savedinfo.show_names;
  378.             CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWNAMES, MF_BYCOMMAND | (g_qeglobals.d_savedinfo.show_names ? MF_CHECKED : MF_UNCHECKED)  );
  379.             Map_BuildBrushData();
  380.             Sys_UpdateWindows (W_XY);
  381.             break;
  382.  
  383.         case ID_VIEW_SHOWCOORDINATES:
  384.             g_qeglobals.d_savedinfo.show_coordinates ^= 1;
  385.             CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWCOORDINATES, MF_BYCOMMAND | (g_qeglobals.d_savedinfo.show_coordinates ? MF_CHECKED : MF_UNCHECKED)  );
  386.             Sys_UpdateWindows (W_XY);
  387.             break;
  388.  
  389.         case ID_VIEW_SHOWBLOCKS:
  390.             g_qeglobals.show_blocks ^= 1;
  391.             CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWBLOCKS, MF_BYCOMMAND | (g_qeglobals.show_blocks ? MF_CHECKED : MF_UNCHECKED)  );
  392.             Sys_UpdateWindows (W_XY);
  393.             break;
  394.  
  395.         case ID_VIEW_SHOWLIGHTS:
  396.             if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIGHTS ) & EXCLUDE_LIGHTS )
  397.                 CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWLIGHTS, MF_BYCOMMAND | MF_UNCHECKED );
  398.             else
  399.                 CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWLIGHTS, MF_BYCOMMAND | MF_CHECKED );                
  400.             Sys_UpdateWindows (W_XY|W_CAMERA);
  401.             break;
  402.  
  403.         case ID_VIEW_SHOWPATH:
  404.             if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_PATHS ) & EXCLUDE_PATHS )
  405.                 CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWPATH, MF_BYCOMMAND | MF_UNCHECKED );
  406.             else
  407.                 CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWPATH, MF_BYCOMMAND | MF_CHECKED );
  408.             Sys_UpdateWindows (W_XY|W_CAMERA);
  409.             break;
  410.  
  411.         case ID_VIEW_SHOWENT:
  412.             if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_ENT ) & EXCLUDE_ENT )
  413.                 CheckMenuItem( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWENT, MF_BYCOMMAND | MF_UNCHECKED);
  414.             else
  415.                 CheckMenuItem( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWENT, MF_BYCOMMAND | MF_CHECKED);
  416.             Sys_UpdateWindows (W_XY|W_CAMERA);
  417.             break;
  418.  
  419.         case ID_VIEW_SHOWWATER:
  420.             if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_WATER ) & EXCLUDE_WATER )
  421.                 CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWWATER, MF_BYCOMMAND | MF_UNCHECKED );
  422.             else
  423.                 CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWWATER, MF_BYCOMMAND | MF_CHECKED );
  424.             Sys_UpdateWindows (W_XY|W_CAMERA);
  425.             break;
  426.  
  427.         case ID_VIEW_SHOWCLIP:
  428.             if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CLIP ) & EXCLUDE_CLIP )
  429.                 CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWCLIP, MF_BYCOMMAND | MF_UNCHECKED );
  430.             else
  431.                 CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWCLIP, MF_BYCOMMAND | MF_CHECKED );
  432.             Sys_UpdateWindows (W_XY|W_CAMERA);
  433.             break;
  434.  
  435.         case ID_VIEW_SHOWDETAIL:
  436.             if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_DETAIL ) & EXCLUDE_DETAIL )
  437.             {
  438.                 CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWDETAIL, MF_BYCOMMAND | MF_UNCHECKED );
  439.                 SetWindowText (g_qeglobals.d_hwndCamera, "Camera View (DETAIL EXCLUDED)");
  440.             }
  441.             else
  442.             {
  443.                 CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWDETAIL, MF_BYCOMMAND | MF_CHECKED );
  444.                 SetWindowText (g_qeglobals.d_hwndCamera, "Camera View");
  445.             }
  446.             Sys_UpdateWindows (W_XY|W_CAMERA);
  447.             break;
  448.  
  449.         case ID_VIEW_SHOWWORLD:
  450.             if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_WORLD ) & EXCLUDE_WORLD )
  451.                 CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWWORLD, MF_BYCOMMAND | MF_UNCHECKED );
  452.             else
  453.                 CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWWORLD, MF_BYCOMMAND | MF_CHECKED );
  454.             Sys_UpdateWindows (W_XY|W_CAMERA);
  455.             break;
  456.  
  457.  
  458. //
  459. // grid menu
  460. //
  461.         case ID_GRID_1:
  462.         case ID_GRID_2:
  463.         case ID_GRID_4:
  464.         case ID_GRID_8:
  465.         case ID_GRID_16:
  466.         case ID_GRID_32:
  467.         case ID_GRID_64:
  468.         {
  469.             hMenu = GetMenu(hWnd);
  470.             
  471.             CheckMenuItem(hMenu, ID_GRID_1, MF_BYCOMMAND | MF_UNCHECKED);
  472.             CheckMenuItem(hMenu, ID_GRID_2, MF_BYCOMMAND | MF_UNCHECKED);
  473.             CheckMenuItem(hMenu, ID_GRID_4, MF_BYCOMMAND | MF_UNCHECKED);
  474.             CheckMenuItem(hMenu, ID_GRID_8, MF_BYCOMMAND | MF_UNCHECKED);
  475.             CheckMenuItem(hMenu, ID_GRID_16, MF_BYCOMMAND | MF_UNCHECKED);
  476.             CheckMenuItem(hMenu, ID_GRID_32, MF_BYCOMMAND | MF_UNCHECKED);
  477.             CheckMenuItem(hMenu, ID_GRID_64, MF_BYCOMMAND | MF_UNCHECKED);
  478.  
  479.             switch (LOWORD(wParam))
  480.             {
  481.                 case ID_GRID_1: g_qeglobals.d_gridsize = 0; break;
  482.                 case ID_GRID_2: g_qeglobals.d_gridsize = 1; break;
  483.                 case ID_GRID_4: g_qeglobals.d_gridsize = 2; break;
  484.                 case ID_GRID_8: g_qeglobals.d_gridsize = 3; break;
  485.                 case ID_GRID_16: g_qeglobals.d_gridsize = 4; break;
  486.                 case ID_GRID_32: g_qeglobals.d_gridsize = 5; break;
  487.                 case ID_GRID_64: g_qeglobals.d_gridsize = 6; break;
  488.             }
  489.             g_qeglobals.d_gridsize = 1 << g_qeglobals.d_gridsize;
  490.  
  491.             CheckMenuItem(hMenu, LOWORD(wParam), MF_BYCOMMAND | MF_CHECKED);
  492.             Sys_UpdateWindows (W_XY|W_Z);
  493.             break;
  494.         }
  495.  
  496. //
  497. // texture menu
  498. //
  499.         case ID_VIEW_NEAREST:                    
  500.         case ID_VIEW_NEARESTMIPMAP:
  501.         case ID_VIEW_LINEAR:
  502.         case ID_VIEW_BILINEAR:
  503.         case ID_VIEW_BILINEARMIPMAP:
  504.         case ID_VIEW_TRILINEAR:
  505.         case ID_TEXTURES_WIREFRAME:
  506.         case ID_TEXTURES_FLATSHADE:
  507.             Texture_SetMode (LOWORD(wParam));
  508.             break;
  509.  
  510.         case ID_TEXTURES_SHOWINUSE:
  511.             Sys_BeginWait ();
  512.             Texture_ShowInuse ();
  513.             SetInspectorMode(W_TEXTURE);
  514.             break;
  515.  
  516.         case ID_TEXTURES_INSPECTOR:
  517.             DoSurface ();
  518.             break;
  519.  
  520.         case CMD_TEXTUREWAD:
  521.         case CMD_TEXTUREWAD+1:
  522.         case CMD_TEXTUREWAD+2:
  523.         case CMD_TEXTUREWAD+3:
  524.         case CMD_TEXTUREWAD+4:
  525.         case CMD_TEXTUREWAD+5:
  526.         case CMD_TEXTUREWAD+6:
  527.         case CMD_TEXTUREWAD+7:
  528.         case CMD_TEXTUREWAD+8:
  529.         case CMD_TEXTUREWAD+9:
  530.         case CMD_TEXTUREWAD+10:
  531.         case CMD_TEXTUREWAD+11:
  532.         case CMD_TEXTUREWAD+12:
  533.         case CMD_TEXTUREWAD+13:
  534.         case CMD_TEXTUREWAD+14:
  535.         case CMD_TEXTUREWAD+15:
  536.         case CMD_TEXTUREWAD+16:
  537.         case CMD_TEXTUREWAD+17:
  538.         case CMD_TEXTUREWAD+18:
  539.         case CMD_TEXTUREWAD+19:
  540.         case CMD_TEXTUREWAD+20:
  541.         case CMD_TEXTUREWAD+21:
  542.         case CMD_TEXTUREWAD+22:
  543.         case CMD_TEXTUREWAD+23:
  544.         case CMD_TEXTUREWAD+24:
  545.         case CMD_TEXTUREWAD+25:
  546.         case CMD_TEXTUREWAD+26:
  547.         case CMD_TEXTUREWAD+27:
  548.         case CMD_TEXTUREWAD+28:
  549.         case CMD_TEXTUREWAD+29:
  550.         case CMD_TEXTUREWAD+30:
  551.         case CMD_TEXTUREWAD+31:
  552.             Sys_BeginWait ();
  553.             Texture_ShowDirectory (LOWORD(wParam));
  554.             SetInspectorMode(W_TEXTURE);
  555.             break;
  556.  
  557. //
  558. // bsp menu
  559. //
  560.         case CMD_BSPCOMMAND:
  561.         case CMD_BSPCOMMAND+1:
  562.         case CMD_BSPCOMMAND+2:
  563.         case CMD_BSPCOMMAND+3:
  564.         case CMD_BSPCOMMAND+4:
  565.         case CMD_BSPCOMMAND+5:
  566.         case CMD_BSPCOMMAND+6:
  567.         case CMD_BSPCOMMAND+7:
  568.         case CMD_BSPCOMMAND+8:
  569.         case CMD_BSPCOMMAND+9:
  570.         case CMD_BSPCOMMAND+10:
  571.         case CMD_BSPCOMMAND+11:
  572.         case CMD_BSPCOMMAND+12:
  573.         case CMD_BSPCOMMAND+13:
  574.         case CMD_BSPCOMMAND+14:
  575.         case CMD_BSPCOMMAND+15:
  576.         case CMD_BSPCOMMAND+16:
  577.         case CMD_BSPCOMMAND+17:
  578.         case CMD_BSPCOMMAND+18:
  579.         case CMD_BSPCOMMAND+19:
  580.         case CMD_BSPCOMMAND+20:
  581.         case CMD_BSPCOMMAND+21:
  582.         case CMD_BSPCOMMAND+22:
  583.         case CMD_BSPCOMMAND+23:
  584.         case CMD_BSPCOMMAND+24:
  585.         case CMD_BSPCOMMAND+25:
  586.         case CMD_BSPCOMMAND+26:
  587.         case CMD_BSPCOMMAND+27:
  588.         case CMD_BSPCOMMAND+28:
  589.         case CMD_BSPCOMMAND+29:
  590.         case CMD_BSPCOMMAND+30:
  591.         case CMD_BSPCOMMAND+31:
  592.             {
  593.                 extern    char    *bsp_commands[256];
  594.  
  595.                 RunBsp (bsp_commands[LOWORD(wParam-CMD_BSPCOMMAND)]);
  596.             }
  597.             break;
  598.  
  599. //
  600. // misc menu
  601. //
  602.         case ID_MISC_BENCHMARK:
  603.             SendMessage ( g_qeglobals.d_hwndCamera,
  604.             WM_USER+267,    0, 0);
  605.             break;
  606.  
  607.         case ID_TEXTUREBK:
  608.             DoColor(COLOR_TEXTUREBACK);
  609.             Sys_UpdateWindows (W_ALL);
  610.             break;
  611.  
  612.         case ID_MISC_SELECTENTITYCOLOR:
  613.             {
  614.                 extern int inspector_mode;
  615.                 
  616.                 if ( ( inspector_mode == W_ENTITY ) && DoColor(COLOR_ENTITY) == true )
  617.                 {
  618.                     extern void AddProp( void );
  619.                     
  620.                     char buffer[100];
  621.                     
  622.                     sprintf( buffer, "%f %f %f", g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][0],
  623.                         g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][1],
  624.                         g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][2] );
  625.                     
  626.                     SetWindowText( hwndEnt[EntValueField], buffer );
  627.                     SetWindowText( hwndEnt[EntKeyField], "_color" );
  628.                     AddProp();
  629.                 }
  630.                 Sys_UpdateWindows( W_ALL );
  631.             }
  632.             break;
  633.  
  634.         case ID_MISC_PRINTXY:
  635.             WXY_Print();
  636.             break;
  637.  
  638.         case ID_COLORS_XYBK:
  639.             DoColor(COLOR_GRIDBACK);
  640.             Sys_UpdateWindows (W_ALL);
  641.             break;
  642.  
  643.         case ID_COLORS_MAJOR:
  644.             DoColor(COLOR_GRIDMAJOR);
  645.             Sys_UpdateWindows (W_ALL);
  646.             break;
  647.  
  648.         case ID_COLORS_MINOR:
  649.             DoColor(COLOR_GRIDMINOR);
  650.             Sys_UpdateWindows (W_ALL);
  651.             break;
  652.  
  653.         case ID_MISC_GAMMA:
  654.             DoGamma();
  655.             break;
  656.  
  657.         case ID_MISC_FINDBRUSH:
  658.             DoFind();
  659.             break;
  660.  
  661.         case ID_MISC_NEXTLEAKSPOT:
  662.             Pointfile_Next();
  663.             break;
  664.         case ID_MISC_PREVIOUSLEAKSPOT:
  665.             Pointfile_Prev();
  666.             break;
  667.  
  668. //
  669. // brush menu
  670. //
  671.         case ID_BRUSH_3SIDED:
  672.             Brush_MakeSided (3);
  673.             break;
  674.         case ID_BRUSH_4SIDED:
  675.             Brush_MakeSided (4);
  676.             break;
  677.         case ID_BRUSH_5SIDED:
  678.             Brush_MakeSided (5);
  679.             break;
  680.         case ID_BRUSH_6SIDED:
  681.             Brush_MakeSided (6);
  682.             break;
  683.         case ID_BRUSH_7SIDED:
  684.             Brush_MakeSided (7);
  685.             break;
  686.         case ID_BRUSH_8SIDED:
  687.             Brush_MakeSided (8);
  688.             break;
  689.         case ID_BRUSH_9SIDED:
  690.             Brush_MakeSided (9);
  691.             break;
  692.         case ID_BRUSH_ARBITRARYSIDED:
  693.             DoSides ();
  694.             break;
  695.  
  696. //
  697. // select menu
  698. //
  699.         case ID_BRUSH_FLIPX:
  700.             Select_FlipAxis (0);
  701.             break;
  702.         case ID_BRUSH_FLIPY:
  703.             Select_FlipAxis (1);
  704.             break;
  705.         case ID_BRUSH_FLIPZ:
  706.             Select_FlipAxis (2);
  707.             break;
  708.         case ID_BRUSH_ROTATEX:
  709.             Select_RotateAxis (0, 90);
  710.             break;
  711.         case ID_BRUSH_ROTATEY:
  712.             Select_RotateAxis (1, 90);
  713.             break;
  714.         case ID_BRUSH_ROTATEZ:
  715.             Select_RotateAxis (2, 90);
  716.             break;
  717.  
  718.         case ID_SELECTION_ARBITRARYROTATION:
  719.             DoRotate ();
  720.             break;
  721.  
  722.         case ID_SELECTION_UNGROUPENTITY:
  723.             Select_Ungroup ();
  724.             break;
  725.  
  726.         case ID_SELECTION_CONNECT:
  727.             ConnectEntities ();
  728.             break;
  729.  
  730.         case ID_SELECTION_DRAGVERTECIES:
  731.             if (g_qeglobals.d_select_mode == sel_vertex)
  732.             {
  733.                 g_qeglobals.d_select_mode = sel_brush;
  734.                 Sys_UpdateWindows (W_ALL);
  735.             }
  736.             else
  737.             {
  738.                 SetupVertexSelection ();
  739.                 if (g_qeglobals.d_numpoints)
  740.                     g_qeglobals.d_select_mode = sel_vertex;
  741.             }
  742.             break;
  743.         case ID_SELECTION_DRAGEDGES:
  744.             if (g_qeglobals.d_select_mode == sel_edge)
  745.             {
  746.                 g_qeglobals.d_select_mode = sel_brush;
  747.                 Sys_UpdateWindows (W_ALL);
  748.             }
  749.             else
  750.             {
  751.                 SetupVertexSelection ();
  752.                 if (g_qeglobals.d_numpoints)
  753.                     g_qeglobals.d_select_mode = sel_edge;
  754.             }
  755.             break;
  756.  
  757.         case ID_SELECTION_SELECTPARTIALTALL:
  758.             Select_PartialTall ();
  759.             break;
  760.         case ID_SELECTION_SELECTCOMPLETETALL:
  761.             Select_CompleteTall ();
  762.             break;
  763.         case ID_SELECTION_SELECTTOUCHING:
  764.             Select_Touching ();
  765.             break;
  766.         case ID_SELECTION_SELECTINSIDE:
  767.             Select_Inside ();
  768.             break;
  769.         case ID_SELECTION_CSGSUBTRACT:
  770.             CSG_Subtract ();
  771.             break;
  772.         case ID_SELECTION_MAKEHOLLOW:
  773.             CSG_MakeHollow ();
  774.             break;
  775.  
  776.         case ID_SELECTION_CLONE:
  777.             Select_Clone ();
  778.             break;
  779.         case ID_SELECTION_DELETE:
  780.             Select_Delete ();
  781.             break;
  782.         case ID_SELECTION_DESELECT:
  783.             Select_Deselect ();
  784.             break;
  785.  
  786.         case ID_SELECTION_MAKE_DETAIL:
  787.             Select_MakeDetail ();
  788.             break;
  789.         case ID_SELECTION_MAKE_STRUCTURAL:
  790.             Select_MakeStructural ();
  791.             break;
  792.  
  793.  
  794. //
  795. // region menu
  796. //
  797.         case ID_REGION_OFF:
  798.             Map_RegionOff ();
  799.             break;
  800.         case ID_REGION_SETXY:
  801.             Map_RegionXY ();
  802.             break;
  803.         case ID_REGION_SETTALLBRUSH:
  804.             Map_RegionTallBrush ();
  805.             break;
  806.         case ID_REGION_SETBRUSH:
  807.             Map_RegionBrush ();
  808.             break;
  809.         case ID_REGION_SETSELECTION:
  810.             Map_RegionSelectedBrushes ();
  811.             break;
  812.  
  813.         case IDMRU+1:
  814.         case IDMRU+2:
  815.         case IDMRU+3:
  816.         case IDMRU+4:
  817.         case IDMRU+5:
  818.         case IDMRU+6:
  819.         case IDMRU+7:
  820.         case IDMRU+8:
  821.         case IDMRU+9:
  822.             DoMru(hWnd,LOWORD(wParam));
  823.             break;
  824.  
  825. //
  826. // help menu
  827. //
  828.  
  829.         case ID_HELP_ABOUT:
  830.             DoAbout();
  831.             break;
  832.  
  833.         default:
  834.             return FALSE;
  835.     }
  836.  
  837.     return TRUE;
  838. }
  839.  
  840. /*
  841. ============
  842. WMAIN_WndProc
  843. ============
  844. */
  845. LONG WINAPI WMAIN_WndProc (
  846.     HWND    hWnd,
  847.     UINT    uMsg,
  848.     WPARAM  wParam,
  849.     LPARAM  lParam)
  850. {
  851.     LONG    lRet = 1;
  852.     RECT    rect;
  853.     HDC        maindc;
  854.  
  855.     GetClientRect(hWnd, &rect);
  856.  
  857.     switch (uMsg)
  858.     {
  859.     case WM_TIMER:
  860.         QE_CountBrushesAndUpdateStatusBar();
  861.         QE_CheckAutoSave();
  862.         return 0;
  863.  
  864.     case WM_DESTROY:
  865.         SaveMruInReg(g_qeglobals.d_lpMruMenu,"Software\\id\\QuakeEd4\\MRU");
  866.         DeleteMruMenu(g_qeglobals.d_lpMruMenu);
  867.         PostQuitMessage(0);
  868.         KillTimer( hWnd, QE_TIMER0 );
  869.         return 0;
  870.  
  871.     case WM_CREATE:
  872.         maindc = GetDC(hWnd);
  873. //        QEW_SetupPixelFormat(maindc, false);
  874.         g_qeglobals.d_lpMruMenu = CreateMruMenuDefault();
  875.         LoadMruInReg(g_qeglobals.d_lpMruMenu,"Software\\id\\QuakeEd4\\MRU");
  876.     
  877.         // Refresh the File menu.
  878.         PlaceMenuMRUItem(g_qeglobals.d_lpMruMenu,GetSubMenu(GetMenu(hWnd),0),
  879.                 ID_FILE_EXIT);
  880.  
  881.         return 0;
  882.  
  883.     case WM_SIZE:
  884.         // resize the status window
  885.         MoveWindow( g_qeglobals.d_hwndStatus, -100, 100, 10, 10, true);
  886.         return 0;
  887.  
  888.     case WM_KEYDOWN:
  889.         return QE_KeyDown (wParam);
  890.  
  891.        case WM_CLOSE:
  892.         /* call destroy window to cleanup and go away */
  893.         SaveWindowState(g_qeglobals.d_hwndXY, "xywindow");
  894.         SaveWindowState(g_qeglobals.d_hwndCamera, "camerawindow");
  895.         SaveWindowState(g_qeglobals.d_hwndZ, "zwindow");
  896.         SaveWindowState(g_qeglobals.d_hwndEntity, "EntityWindow");
  897.         SaveWindowState(g_qeglobals.d_hwndMain, "mainwindow");
  898.  
  899.         // FIXME: is this right?
  900.         SaveRegistryInfo("SavedInfo", &g_qeglobals.d_savedinfo, sizeof(g_qeglobals.d_savedinfo));
  901.         DestroyWindow (hWnd);
  902.         return 0;
  903.  
  904.     case WM_COMMAND:
  905.         return CommandHandler (hWnd, wParam, lParam);
  906.         return 0;
  907.     }
  908.  
  909.     return DefWindowProc (hWnd, uMsg, wParam, lParam);
  910. }
  911.  
  912.  
  913.  
  914.  
  915. /*
  916. ==============
  917. Main_Create
  918. ==============
  919. */
  920. void Main_Create (HINSTANCE hInstance)
  921. {
  922.     WNDCLASS   wc;
  923.     int           i;
  924.     HMENU      hMenu;
  925.  
  926.     /* Register the camera class */
  927.     memset (&wc, 0, sizeof(wc));
  928.  
  929.     wc.style         = 0;
  930.     wc.lpfnWndProc   = (WNDPROC)WMAIN_WndProc;
  931.     wc.cbClsExtra    = 0;
  932.     wc.cbWndExtra    = 0;
  933.     wc.hInstance     = hInstance;
  934.     wc.hIcon         = 0;
  935.     wc.hCursor       = LoadCursor (NULL,IDC_ARROW);
  936.     wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
  937.     wc.lpszMenuName  = MAKEINTRESOURCE(IDR_MENU1);
  938.     wc.lpszClassName = "QUAKE_MAIN";
  939.  
  940.     if (!RegisterClass (&wc) )
  941.         Error ("WCam_Register: failed");
  942.  
  943.  
  944.     g_qeglobals.d_hwndMain = CreateWindow ("QUAKE_MAIN" ,
  945.         "QuakeEd 3",
  946.         WS_OVERLAPPEDWINDOW |
  947.         WS_CLIPSIBLINGS |
  948.         WS_CLIPCHILDREN,
  949.         0,0,screen_width,screen_height+GetSystemMetrics(SM_CYSIZE),    // size
  950.         0,
  951.         0,        // no menu
  952.         hInstance,
  953.         NULL);
  954.     if (!g_qeglobals.d_hwndMain)
  955.         Error ("Couldn't create main window");
  956.  
  957.     /* create a timer so that we can count brushes */
  958.     SetTimer( g_qeglobals.d_hwndMain, 
  959.               QE_TIMER0,
  960.               1000,
  961.               NULL );
  962.     
  963.     LoadWindowState(g_qeglobals.d_hwndMain, "mainwindow");
  964.  
  965.     s_hwndToolbar = CreateToolBar(hInstance);
  966.     
  967.     g_qeglobals.d_hwndStatus = CreateMyStatusWindow(hInstance);
  968.  
  969.     //
  970.     // load misc info from registry
  971.     //
  972.     i = sizeof(g_qeglobals.d_savedinfo);
  973.     LoadRegistryInfo("SavedInfo", &g_qeglobals.d_savedinfo, &i);
  974.     
  975.     if (g_qeglobals.d_savedinfo.iSize != sizeof(g_qeglobals.d_savedinfo))
  976.     {
  977.         // fill in new defaults
  978.  
  979.         g_qeglobals.d_savedinfo.iSize = sizeof(g_qeglobals.d_savedinfo);
  980.         g_qeglobals.d_savedinfo.fGamma = 1.0;
  981.         g_qeglobals.d_savedinfo.iTexMenu = ID_VIEW_NEAREST;
  982.  
  983.         g_qeglobals.d_savedinfo.exclude = 0;
  984.         g_qeglobals.d_savedinfo.show_coordinates = true;
  985.         g_qeglobals.d_savedinfo.show_names       = true;
  986.  
  987.         for (i=0 ; i<3 ; i++)
  988.         {
  989.             g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25;
  990.             g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 1.0;
  991.             g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 0.75;
  992.             g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][i] = 0.5;
  993.             g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25;
  994.         }
  995.     }
  996.  
  997.     if ( ( hMenu = GetMenu( g_qeglobals.d_hwndMain ) ) != 0 )
  998.     {
  999.         /*
  1000.         ** by default all of these are checked because that's how they're defined in the menu editor
  1001.         */
  1002.         if ( !g_qeglobals.d_savedinfo.show_names )
  1003.             CheckMenuItem( hMenu, ID_VIEW_SHOWNAMES, MF_BYCOMMAND | MF_UNCHECKED );
  1004.         if ( !g_qeglobals.d_savedinfo.show_coordinates )
  1005.             CheckMenuItem( hMenu, ID_VIEW_SHOWCOORDINATES, MF_BYCOMMAND | MF_UNCHECKED );
  1006.  
  1007.         if ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIGHTS )
  1008.             CheckMenuItem( hMenu, ID_VIEW_SHOWLIGHTS, MF_BYCOMMAND | MF_UNCHECKED );
  1009.         if ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_ENT )
  1010.             CheckMenuItem( hMenu, ID_VIEW_ENTITY, MF_BYCOMMAND | MF_UNCHECKED );
  1011.         if ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_PATHS )
  1012.             CheckMenuItem( hMenu, ID_VIEW_SHOWPATH, MF_BYCOMMAND | MF_UNCHECKED );
  1013.         if ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_WATER )
  1014.             CheckMenuItem( hMenu, ID_VIEW_SHOWWATER, MF_BYCOMMAND | MF_UNCHECKED );
  1015.         if ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_WORLD )
  1016.             CheckMenuItem( hMenu, ID_VIEW_SHOWWORLD, MF_BYCOMMAND | MF_UNCHECKED );
  1017.         if ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_CLIP )
  1018.             CheckMenuItem( hMenu, ID_VIEW_SHOWCLIP, MF_BYCOMMAND | MF_UNCHECKED );
  1019.     }
  1020.  
  1021.     ShowWindow (g_qeglobals.d_hwndMain, SW_SHOWDEFAULT);
  1022. }
  1023.  
  1024.  
  1025. /*
  1026. =============================================================
  1027.  
  1028. REGISTRY INFO
  1029.  
  1030. =============================================================
  1031. */
  1032.  
  1033. BOOL SaveRegistryInfo(const char *pszName, void *pvBuf, long lSize)
  1034. {
  1035.     LONG lres;
  1036.     DWORD dwDisp;
  1037.     HKEY  hKeyId;
  1038.  
  1039.     lres = RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\id\\QuakeEd4", 0, NULL, 
  1040.             REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKeyId, &dwDisp);
  1041.     
  1042.     if (lres != ERROR_SUCCESS)
  1043.         return FALSE;
  1044.  
  1045.     lres = RegSetValueEx(hKeyId, pszName, 0, REG_BINARY, pvBuf, lSize);
  1046.     
  1047.     RegCloseKey(hKeyId);
  1048.  
  1049.     if (lres != ERROR_SUCCESS)
  1050.         return FALSE;
  1051.  
  1052.     return TRUE;
  1053. }
  1054.  
  1055. BOOL LoadRegistryInfo(const char *pszName, void *pvBuf, long *plSize)
  1056. {
  1057.     HKEY  hKey;
  1058.     long lres, lType, lSize;
  1059.  
  1060.     if (plSize == NULL)
  1061.         plSize = &lSize;
  1062.  
  1063.     lres = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\id\\QuakeEd4", 0, KEY_READ, &hKey);
  1064.     
  1065.     if (lres != ERROR_SUCCESS)
  1066.         return FALSE;
  1067.  
  1068.     lres = RegQueryValueEx(hKey, pszName, NULL, &lType, pvBuf, plSize);
  1069.  
  1070.     RegCloseKey(hKey);
  1071.  
  1072.     if (lres != ERROR_SUCCESS)
  1073.         return FALSE;
  1074.  
  1075.     return TRUE;
  1076. }
  1077.  
  1078. BOOL SaveWindowState(HWND hWnd, const char *pszName)
  1079. {
  1080.     RECT rc;
  1081.     
  1082.     GetWindowRect(hWnd, &rc);
  1083.     if (hWnd != g_qeglobals.d_hwndMain)
  1084.         MapWindowPoints(NULL, g_qeglobals.d_hwndMain, (POINT *)&rc, 2);
  1085.     return SaveRegistryInfo(pszName, &rc, sizeof(rc));
  1086. }
  1087.  
  1088.  
  1089. BOOL LoadWindowState(HWND hWnd, const char *pszName)
  1090. {
  1091.     RECT rc;
  1092.     LONG lSize = sizeof(rc);
  1093.  
  1094.     if (LoadRegistryInfo(pszName, &rc, &lSize))
  1095.     {
  1096.         if (rc.left < 0)
  1097.             rc.left = 0;
  1098.         if (rc.top < 0)
  1099.             rc.top = 0;
  1100.         if (rc.right < rc.left + 16)
  1101.             rc.right = rc.left + 16;
  1102.         if (rc.bottom < rc.top + 16)
  1103.             rc.bottom = rc.top + 16;
  1104.  
  1105.         MoveWindow(hWnd, rc.left, rc.top, rc.right - rc.left, 
  1106.                 rc.bottom - rc.top, FALSE);
  1107.         return TRUE;
  1108.     }
  1109.  
  1110.     return FALSE;
  1111. }
  1112.  
  1113. /*
  1114. ===============================================================
  1115.  
  1116.   STATUS WINDOW
  1117.  
  1118. ===============================================================
  1119. */
  1120.  
  1121. void Sys_UpdateStatusBar( void )
  1122. {
  1123.     extern int   g_numbrushes, g_numentities;
  1124.  
  1125.     char numbrushbuffer[100]="";
  1126.  
  1127.     sprintf( numbrushbuffer, "Brushes: %d Entities: %d", g_numbrushes, g_numentities );
  1128.  
  1129.     Sys_Status( numbrushbuffer, 2 );
  1130. }
  1131.  
  1132. void Sys_Status(const char *psz, int part )
  1133. {
  1134.     SendMessage(g_qeglobals.d_hwndStatus, SB_SETTEXT, part, (LPARAM)psz);
  1135. }
  1136.  
  1137. static HWND CreateMyStatusWindow(HINSTANCE hInst)
  1138. {
  1139.     HWND hWnd;
  1140.     int partsize[3] = { 300, 1100, -1 };
  1141.  
  1142.     hWnd = CreateWindowEx( WS_EX_TOPMOST, // no extended styles
  1143.             STATUSCLASSNAME,                 // status bar
  1144.             "",                              // no text 
  1145.             WS_CHILD | WS_BORDER | WS_VISIBLE,  // styles
  1146.             -100, -100, 10, 10,              // x, y, cx, cy
  1147.             g_qeglobals.d_hwndMain,          // parent window
  1148.             (HMENU)100,                      // window ID
  1149.             hInst,                           // instance
  1150.             NULL);                             // window data
  1151.  
  1152.     SendMessage( hWnd, SB_SETPARTS, 3, ( long ) partsize );
  1153.     
  1154.     return hWnd;
  1155. }
  1156.  
  1157. //==============================================================
  1158.  
  1159. #define NUMBUTTONS 15
  1160. HWND CreateToolBar(HINSTANCE hinst)
  1161.     HWND hwndTB; 
  1162.     TBADDBITMAP tbab; 
  1163.     TBBUTTON tbb[NUMBUTTONS]; 
  1164.     
  1165.      // Ensure that the common control DLL is loaded. 
  1166.  
  1167.     InitCommonControls(); 
  1168.  
  1169.     // Create a toolbar that the user can customize and that has a 
  1170.     // tooltip associated with it. 
  1171.  
  1172.     hwndTB = CreateWindowEx(0, TOOLBARCLASSNAME, (LPSTR) NULL, 
  1173.         WS_CHILD | TBSTYLE_TOOLTIPS | CCS_ADJUSTABLE | WS_BORDER, 
  1174.         0, 0, 0, 0, g_qeglobals.d_hwndMain, (HMENU) IDR_TOOLBAR1, hinst, NULL); 
  1175.  
  1176.     // Send the TB_BUTTONSTRUCTSIZE message, which is required for 
  1177.     // backward compatibility. 
  1178.  
  1179.     SendMessage(hwndTB, TB_BUTTONSTRUCTSIZE, (WPARAM) sizeof(TBBUTTON), 0);
  1180.  
  1181.     // Add the bitmap containing button images to the toolbar. 
  1182.  
  1183.     tbab.hInst = hinst; 
  1184.     tbab.nID   = IDR_TOOLBAR1; 
  1185.     SendMessage(hwndTB, TB_ADDBITMAP, (WPARAM)NUMBUTTONS, (WPARAM) &tbab); 
  1186.  
  1187.     // Fill the TBBUTTON array with button information, and add the 
  1188.     // buttons to the toolbar. 
  1189.  
  1190.     tbb[0].iBitmap = 0; 
  1191.     tbb[0].idCommand = ID_BRUSH_FLIPX; 
  1192.     tbb[0].fsState = TBSTATE_ENABLED; 
  1193.     tbb[0].fsStyle = TBSTYLE_BUTTON; 
  1194.     tbb[0].dwData = 0; 
  1195.     tbb[0].iString = 0; 
  1196.  
  1197.     tbb[1].iBitmap = 2; 
  1198.     tbb[1].idCommand = ID_BRUSH_FLIPY; 
  1199.     tbb[1].fsState = TBSTATE_ENABLED; 
  1200.     tbb[1].fsStyle = TBSTYLE_BUTTON; 
  1201.     tbb[1].dwData = 0; 
  1202.     tbb[1].iString = 0; 
  1203.  
  1204.     tbb[2].iBitmap = 4; 
  1205.     tbb[2].idCommand = ID_BRUSH_FLIPZ; 
  1206.     tbb[2].fsState = TBSTATE_ENABLED;
  1207.     tbb[2].fsStyle = TBSTYLE_BUTTON; 
  1208.     tbb[2].dwData = 0; 
  1209.     tbb[2].iString = 0; 
  1210.  
  1211.     tbb[3].iBitmap = 1; 
  1212.     tbb[3].idCommand = ID_BRUSH_ROTATEX; 
  1213.     tbb[3].fsState = TBSTATE_ENABLED; 
  1214.     tbb[3].fsStyle = TBSTYLE_BUTTON; 
  1215.     tbb[3].dwData = 0; 
  1216.     tbb[3].iString = 0; 
  1217.  
  1218.     tbb[4].iBitmap = 3; 
  1219.     tbb[4].idCommand = ID_BRUSH_ROTATEY; 
  1220.     tbb[4].fsState = TBSTATE_ENABLED; 
  1221.     tbb[4].fsStyle = TBSTYLE_BUTTON; 
  1222.     tbb[4].dwData = 0; 
  1223.     tbb[4].iString = 0; 
  1224.  
  1225.     tbb[5].iBitmap = 5; 
  1226.     tbb[5].idCommand = ID_BRUSH_ROTATEZ; 
  1227.     tbb[5].fsState = TBSTATE_ENABLED; 
  1228.     tbb[5].fsStyle = TBSTYLE_BUTTON; 
  1229.     tbb[5].dwData = 0; 
  1230.     tbb[5].iString = 0; 
  1231.  
  1232.     tbb[6].iBitmap = 6; 
  1233.     tbb[6].idCommand = ID_SELECTION_SELECTCOMPLETETALL; 
  1234.     tbb[6].fsState = TBSTATE_ENABLED; 
  1235.     tbb[6].fsStyle = TBSTYLE_BUTTON; 
  1236.     tbb[6].dwData = 0; 
  1237.     tbb[6].iString = 0; 
  1238.  
  1239.     tbb[7].iBitmap = 7; 
  1240.     tbb[7].idCommand = ID_SELECTION_SELECTTOUCHING; 
  1241.     tbb[7].fsState = TBSTATE_ENABLED; 
  1242.     tbb[7].fsStyle = TBSTYLE_BUTTON; 
  1243.     tbb[7].dwData = 0; 
  1244.     tbb[7].iString = 0; 
  1245.  
  1246.     tbb[8].iBitmap = 8; 
  1247.     tbb[8].idCommand = ID_SELECTION_SELECTPARTIALTALL; 
  1248.     tbb[8].fsState = TBSTATE_ENABLED; 
  1249.     tbb[8].fsStyle = TBSTYLE_BUTTON; 
  1250.     tbb[8].dwData = 0; 
  1251.     tbb[8].iString = 0; 
  1252.  
  1253.  
  1254.     tbb[9].iBitmap = 9; 
  1255.     tbb[9].idCommand = ID_SELECTION_SELECTINSIDE; 
  1256.     tbb[9].fsState = TBSTATE_ENABLED; 
  1257.     tbb[9].fsStyle = TBSTYLE_BUTTON; 
  1258.     tbb[9].dwData = 0; 
  1259.     tbb[9].iString = 0; 
  1260.  
  1261.     tbb[10].iBitmap = 10; 
  1262.     tbb[10].idCommand = ID_SELECTION_CSGSUBTRACT; 
  1263.     tbb[10].fsState = TBSTATE_ENABLED; 
  1264.     tbb[10].fsStyle = TBSTYLE_BUTTON; 
  1265.     tbb[10].dwData = 0; 
  1266.     tbb[10].iString = 0; 
  1267.  
  1268.  
  1269.     tbb[11].iBitmap = 11;
  1270.     tbb[11].idCommand = ID_SELECTION_MAKEHOLLOW; 
  1271.     tbb[11].fsState = TBSTATE_ENABLED; 
  1272.     tbb[11].fsStyle = TBSTYLE_BUTTON; 
  1273.     tbb[11].dwData = 0; 
  1274.     tbb[11].iString = 0; 
  1275.  
  1276.     tbb[12].iBitmap = 12;
  1277.     tbb[12].idCommand = ID_TEXTURES_WIREFRAME; 
  1278.     tbb[12].fsState = TBSTATE_ENABLED; 
  1279.     tbb[12].fsStyle = TBSTYLE_BUTTON; 
  1280.     tbb[12].dwData = 0; 
  1281.     tbb[12].iString = 0; 
  1282.  
  1283.     tbb[13].iBitmap = 13;
  1284.     tbb[13].idCommand = ID_TEXTURES_FLATSHADE; 
  1285.     tbb[13].fsState = TBSTATE_ENABLED; 
  1286.     tbb[13].fsStyle = TBSTYLE_BUTTON; 
  1287.     tbb[13].dwData = 0; 
  1288.     tbb[13].iString = 0; 
  1289.  
  1290.     tbb[14].iBitmap = 14;
  1291.     tbb[14].idCommand = ID_VIEW_TRILINEAR; 
  1292.     tbb[14].fsState = TBSTATE_ENABLED; 
  1293.     tbb[14].fsStyle = TBSTYLE_BUTTON; 
  1294.     tbb[14].dwData = 0; 
  1295.     tbb[14].iString = 0; 
  1296.  
  1297.     SendMessage(hwndTB, TB_ADDBUTTONS, (WPARAM)NUMBUTTONS,
  1298.         (LPARAM) (LPTBBUTTON) &tbb); 
  1299.  
  1300.     ShowWindow(hwndTB, SW_SHOW); 
  1301.  
  1302.     return hwndTB; 
  1303.  
  1304.